
/*
 * 服务端路由：启动一个下载的服务
 *
 * 实现：
 * - 通道流：读取服务端文件流，通过管道连接到输出即可，不用管理如何去传输，只需要设置响应头等信息
 * - 可以监听下载过程，如：data/end
 * 
 * 注意：
 * - 服务端只会检测读取本地文件流 是否正确
 * - 对于输出流的接收对象不管，对于是否为文件不属于服务端来判断
 * 
 * 问题：
 * - 如何让请求方知道传输文件的名字呢？？？(请求方根据 url 带的参数来自行处理)
 */
const path = require('path')
const fs = require('fs')

function download(req, res) {
    let filename = req.params.file
    let filepath = path.resolve(__dirname, 'resources', filename)
    let stats = fs.statSync(filepath)
    if (stats.isFile()) {
        res.set({
            'Content-Type': 'application/octet-stream',
            'Content-Disposition': 'attachment; filename=' + filename,
            'Content-Length': stats.size
          });

        let readStream = fs.createReadStream(filepath)

        // 监听非必须
        let copySize = 0; 
        readStream.on('data', data => {
            copySize += data.length
            console.log(`服务端传输数据量: ${copySize}`)
        });
        readStream.on('end', () => { console.log('服务端传输完毕') })

        readStream.pipe(res);
    }else {   
        // 请求的内容不是一个文件
        res.sendStatus(400)
    }
}

module.exports = download

